This notebook generates plots for all Studies.

source("../scripts_general/dependencies.R")
source("../scripts_general/custom_funs.R")
source("../scripts_general/var_recode_contrast.R")
source("../scripts_general/data_load.R")
# rescale to 0-1
d1_fig <- d1 %>%
  filter(!is.na(country)) %>%
  mutate(spev_score = spev_score/1,
         pv_score = pv_score/3,
         abs_score = abs_score/1)

d2_fig <- d2 %>%
  filter(!is.na(country)) %>%
  mutate(spev_score = spev_score/1,
         por_score = por_score/1)

d3_fig <- d3 %>%
  filter(!is.na(country)) %>%
  mutate(spev_score = spev_score/4,
         dse_score = dse_score/5,
         abs_score = abs_score/1)

d4_fig <- d4 %>%
  filter(!is.na(country)) %>%
  mutate(spev_score = spev_score/4,
         dse_score = dse_score/5,
         pv_score = pv_score/3,
         por_score = por_score/2,
         abs_score = abs_score/1,
         hall_score = hall_score/3,
         para_score = para_score/1,
         cog_score = (cog_score + 2)/4,
         ctl_score = (ctl_score + 3)/6)

Figure 1

d_sum_s1 <- d1_fig %>%
  mutate(religion = recode_factor(
    religion,
    "local" = "Faith of local salience",
    "charismatic" = "Charismatic evangelical Christianity")) %>%
  group_by(country, religion, site) %>%
  summarise_at(vars(spev_score, pv_score, abs_score),
               funs(mean = mean(., na.rm = T), sd = sd(., na.rm = T))) %>%
  ungroup()
d_width <- 0.8
fig1_row1 <- d1_fig %>% 
  mutate(religion = recode_factor(
    religion,
    "local" = "Faith of local salience",
    "charismatic" = "Charismatic evangelical Christianity")) %>%
  ggplot(aes(x = country, y = spev_score, 
             color = country, fill = country, 
             shape = site)) +
  facet_grid(~ religion) +
  geom_point(position = position_jitterdodge(jitter.width = d_width/1.5,
                                             jitter.height = 0,
                                             dodge.width = d_width), 
             alpha = 0.25, show.legend = F) +
  geom_pointrange(data = . %>%
                    group_by(country, religion, site) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  position = position_dodge(width = d_width),
                  color = "black") +
  geom_text(data = d_sum_s1 %>%
              mutate_at(vars(-country, -religion, -site), 
                        funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(spev_score_mean, "\n(", spev_score_sd, ")")),
            position = position_dodge(width = d_width),
            color = "black", size = 2.5, vjust = 1) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_shape_manual(values = 21:24) +
  scale_y_continuous(limits = c(NA, 1), breaks = seq(0, 1, 0.25)) +
  theme(legend.position = "bottom") +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  labs(x = "Country", y = "Spiritual Events", shape = "Site")
fig1_title <- ggdraw() + 
  draw_label("STUDY 1", fontface = 'bold', x = 0, hjust = 0.5) +
  theme(plot.margin = margin(0, 0, 0, 35))

fig1 <- plot_grid(
  fig1_title,
  plot_grid(fig1_row1, 
            ncol = 1),
  ncol = 1, rel_heights = c(1, 20))
Removed 4 rows containing missing values (geom_point).
ggsave("./png_files/fig1.png", plot = fig1, device = "png", width = 9, height = 9 * 0.5)
fig1

Spiritual Events scores, by religion, country, and site in Study 1, rescaled to range from 0-1. Small points correspond to individual participants, larger points are means, and error bars are ±1 standard deviation; means (and standard deviations) are also provided. Local religions were as follows—US: Methodism; Ghana: African traditional religion; Thailand: Buddhism; urban China: Buddhism; rural China: spirit mediumship; urban Vanuatu: Presbyterianism; rural Vanuatu: ancestral kastom practices.

Figure 2

fig2_fun <- function(g){
  new_plot <- g +
    geom_point(aes(color = country), alpha = 0.1) +
    geom_smooth(aes(color = country), method = "lm", 
                lty = 2, size = 0.7, alpha = 0, show.legend = F) +
    geom_smooth(method = "lm", color = "black", alpha = 0.7) +
    scale_color_brewer(palette = "Dark2") +
    xlim(0, 1) +
    ylim(0, 1) +
    theme(legend.position = "none") +
    guides(color = guide_legend(override.aes = list(alpha = 1)))
  
  return(new_plot)
}
fig2_study1_pv <- d1_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = pv_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Vignettes",
       y = "Spiritual Events",
       color = "Country")

fig2_study1_abs <- d1_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Spiritual Events",
       color = "Country")

fig2_study2_por <- d2_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = por_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Scale",
       y = "Spiritual Events",
       color = "Country")

fig2_study3_abs <- d3_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Spiritual Events",
       color = "Country")

fig2_study4_pv <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = pv_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Vignettes",
       y = "Spiritual Events",
       color = "Country")

fig2_study4_por <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = por_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Scale",
       y = "Spiritual Events",
       color = "Country")

fig2_study4_abs <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Spiritual Events",
       color = "Country")
fig2_study1_title <- ggdraw() + 
  draw_label("STUDY 1", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig2_row1 <- plot_grid(
  fig2_study1_title,
  plot_grid(fig2_study1_pv, fig2_study1_abs, ncol = 2, labels = c("A", "B")),
  ncol = 1, rel_heights = c(1, 10))
Removed 20 rows containing non-finite values (stat_smooth).Removed 20 rows containing non-finite values (stat_smooth).Removed 20 rows containing missing values (geom_point).Removed 28 rows containing non-finite values (stat_smooth).Removed 28 rows containing non-finite values (stat_smooth).Removed 28 rows containing missing values (geom_point).
fig2_study2_title <- ggdraw() + 
  draw_label("STUDY 2", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig2_study3_title <- ggdraw() + 
  draw_label("STUDY 3", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig2_row2 <- plot_grid(
  plot_grid(fig2_study2_title, fig2_study3_title),
  plot_grid(fig2_study2_por, fig2_study3_abs, 
            ncol = 2, labels = c("C", "D")),
  ncol = 1, rel_heights = c(1, 10))
Removed 10 rows containing missing values (geom_smooth).
fig2_study4_title <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig2_row3 <- plot_grid(
  fig2_study4_title,
  plot_grid(plot_grid(fig2_study4_pv, fig2_study4_por, 
                      ncol = 1, labels = c("E", "F")), 
            plot_grid(NULL, fig2_study4_abs, NULL, 
                      ncol = 1, rel_heights = c(1, 2, 1), labels = c("", "G", "")), 
            ncol = 2),
  ncol = 1, rel_heights = c(1, 20))
Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).Removed 11 rows containing missing values (geom_smooth).
fig_legend <- get_legend(fig2_study1_pv + theme(legend.position = "bottom"))
Removed 20 rows containing non-finite values (stat_smooth).Removed 20 rows containing non-finite values (stat_smooth).Removed 20 rows containing missing values (geom_point).
fig2 <- plot_grid(fig2_row1, fig2_row2, fig2_row3, fig_legend,
                  ncol = 1, rel_heights = c(1, 1, 2, 0.2))

ggsave("./png_files/fig2.png", plot = fig2, device = "png", width = 6, height = 6 * 2.1)
fig2

Relationships between Spiritual Events scores and scores on measures of porosity (left) and absorption (right), by study and country, rescaled to range from 0-1. Small colored points correspond to individual participants, dotted colored lines correspond to the trend within each country, and solid black lines correspond to the overall trend collapsing across countries. See Fig. S1 for a parallel visualization of Daily Spiritual Experiences scores in Studies 3-4.

Figure 3

fig3_fun <- function(g){
  new_plot <- g +
    geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
    scale_color_brewer(palette = "Dark2") +
    scale_fill_brewer(palette = "Dark2") +
    scale_y_continuous(limits = c(NA, 1), breaks = seq(0, 1, 0.25))
  
  return(new_plot)
}
d_sum_s4 <- d4_fig %>%
  group_by(country) %>%
  summarise_at(vars(spev_score, dse_score, pv_score, por_score, abs_score),
               funs(mean = mean(., na.rm = T), sd = sd(., na.rm = T))) %>%
  ungroup()
fig3_spev <- d4_fig %>%
  ggplot(aes(x = country, y = spev_score, color = country, fill = country)) %>%
  fig3_fun() +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(spev_score_mean, "\n(", spev_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  labs(x = "Country", y = "Spiritual Events")
fig3_dse <- d4_fig %>%
  ggplot(aes(x = country, y = dse_score, color = country, fill = country)) %>%
  fig3_fun() +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(dse_score, na.rm = T),
                              sd = sd(dse_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(dse_score_mean, "\n(", dse_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  labs(x = "Country", y = "Daily Spiritual Experiences")
fig3_pv <- d4_fig %>%
  ggplot(aes(x = country, y = pv_score, color = country, fill = country)) %>%
  fig3_fun() +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(pv_score, na.rm = T),
                              sd = sd(pv_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(pv_score_mean, "\n(", pv_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  labs(x = "Country", y = "Porosity Vignettes")
fig3_por <- d4_fig %>%
  ggplot(aes(x = country, y = por_score, color = country, fill = country)) %>%
  fig3_fun() +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(por_score, na.rm = T),
                              sd = sd(por_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(por_score_mean, "\n(", por_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  labs(x = "Country", y = "Porosity Scale")
fig3_abs <- d4_fig %>%
  ggplot(aes(x = country, y = abs_score, color = country, fill = country)) %>%
  fig3_fun() +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(abs_score, na.rm = T),
                              sd = sd(abs_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(abs_score_mean, "\n(", abs_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  labs(x = "Country", y = "Absorption")
fig3_study4_title <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0.5) +
  theme(plot.margin = margin(0, 0, 0, 35))

fig3 <- plot_grid(
  fig3_study4_title,
  plot_grid(fig3_spev, fig3_dse, 
            fig3_pv, fig3_por, 
            fig3_abs, NULL, 
            ncol = 2, labels = c("A", "B", "C", "D", "E")),
  ncol = 1, rel_heights = c(1, 20))
Removed 2 rows containing missing values (geom_point).
ggsave("./png_files/fig3.png", plot = fig3, device = "png", width = 7, height = 7 * 1.5)
fig3

Scores on measures of spiritual experience (A-B), porosity (C-D) and absorption (E) in Study 4, rescaled to range from 0-1. Small points correspond to individual participants, larger points are means, and error bars are ±1 standard deviation; means (and standard deviations) are also provided.

Figure S1

figs1_study3_abs <- d3_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = dse_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Daily Spiritual Experiences",
       color = "Country")

figs1_study4_pv <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = pv_score, y = dse_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Vignettes",
       y = "Daily Spiritual Experiences",
       color = "Country")

figs1_study4_por <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = por_score, y = dse_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Scale",
       y = "Daily Spiritual Experiences",
       color = "Country")

figs1_study4_abs <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = dse_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Daily Spiritual Experiences",
       color = "Country")
figs1_study3_title <- ggdraw() + 
  draw_label("STUDY 3", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

figs1_study4_title <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

figs1_row1 <- plot_grid(
  plot_grid(figs1_study4_title, figs1_study3_title),
  plot_grid(figs1_study4_pv, figs1_study3_abs, ncol = 2, labels = c("A", "B")),
  plot_grid(figs1_study4_title, figs1_study4_title),
  plot_grid(figs1_study4_por, figs1_study4_abs, ncol = 2, labels = c("C", "D")),
  ncol = 1, rel_heights = c(1, 10, 1, 10))
fig_legend <- get_legend(figs1_study4_pv + theme(legend.position = "bottom"))
figs1 <- plot_grid(figs1_row1, fig_legend,
                   ncol = 1, rel_heights = c(2, 0.2))

ggsave("./png_files/figs1.png", plot = figs1, device = "png", width = 6, height = 6 * 1.2)
figs1

Relationships between Daily Spiritual Experiences scores and scores on our measures of porosity (left side) and absorption (right side), by study and country, rescaled to range from 0-1. Small colored points correspond to individual participants, dotted colored lines correspond to the trend within each country, and solid black lines correspond to the overall trend, collapsing across countries.

LS0tCnRpdGxlOiAiRmlndXJlcyIKc3VidGl0bGU6ICJMdWhybWFubiwgV2Vpc21hbiwgZXQgYWwuIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KClRoaXMgbm90ZWJvb2sgZ2VuZXJhdGVzIHBsb3RzIGZvciBhbGwgU3R1ZGllcy4KCmBgYHtyLCBtZXNzYWdlID0gRn0Kc291cmNlKCIuLi9zY3JpcHRzX2dlbmVyYWwvZGVwZW5kZW5jaWVzLlIiKQpzb3VyY2UoIi4uL3NjcmlwdHNfZ2VuZXJhbC9jdXN0b21fZnVucy5SIikKc291cmNlKCIuLi9zY3JpcHRzX2dlbmVyYWwvdmFyX3JlY29kZV9jb250cmFzdC5SIikKc291cmNlKCIuLi9zY3JpcHRzX2dlbmVyYWwvZGF0YV9sb2FkLlIiKQpgYGAKCmBgYHtyfQojIHJlc2NhbGUgdG8gMC0xCmQxX2ZpZyA8LSBkMSAlPiUKICBmaWx0ZXIoIWlzLm5hKGNvdW50cnkpKSAlPiUKICBtdXRhdGUoc3Bldl9zY29yZSA9IHNwZXZfc2NvcmUvMSwKICAgICAgICAgcHZfc2NvcmUgPSBwdl9zY29yZS8zLAogICAgICAgICBhYnNfc2NvcmUgPSBhYnNfc2NvcmUvMSkKCmQyX2ZpZyA8LSBkMiAlPiUKICBmaWx0ZXIoIWlzLm5hKGNvdW50cnkpKSAlPiUKICBtdXRhdGUoc3Bldl9zY29yZSA9IHNwZXZfc2NvcmUvMSwKICAgICAgICAgcG9yX3Njb3JlID0gcG9yX3Njb3JlLzEpCgpkM19maWcgPC0gZDMgJT4lCiAgZmlsdGVyKCFpcy5uYShjb3VudHJ5KSkgJT4lCiAgbXV0YXRlKHNwZXZfc2NvcmUgPSBzcGV2X3Njb3JlLzQsCiAgICAgICAgIGRzZV9zY29yZSA9IGRzZV9zY29yZS81LAogICAgICAgICBhYnNfc2NvcmUgPSBhYnNfc2NvcmUvMSkKCmQ0X2ZpZyA8LSBkNCAlPiUKICBmaWx0ZXIoIWlzLm5hKGNvdW50cnkpKSAlPiUKICBtdXRhdGUoc3Bldl9zY29yZSA9IHNwZXZfc2NvcmUvNCwKICAgICAgICAgZHNlX3Njb3JlID0gZHNlX3Njb3JlLzUsCiAgICAgICAgIHB2X3Njb3JlID0gcHZfc2NvcmUvMywKICAgICAgICAgcG9yX3Njb3JlID0gcG9yX3Njb3JlLzIsCiAgICAgICAgIGFic19zY29yZSA9IGFic19zY29yZS8xLAogICAgICAgICBoYWxsX3Njb3JlID0gaGFsbF9zY29yZS8zLAogICAgICAgICBwYXJhX3Njb3JlID0gcGFyYV9zY29yZS8xLAogICAgICAgICBjb2dfc2NvcmUgPSAoY29nX3Njb3JlICsgMikvNCwKICAgICAgICAgY3RsX3Njb3JlID0gKGN0bF9zY29yZSArIDMpLzYpCmBgYAoKCiMgRmlndXJlIDEKCmBgYHtyfQpkX3N1bV9zMSA8LSBkMV9maWcgJT4lCiAgbXV0YXRlKHJlbGlnaW9uID0gcmVjb2RlX2ZhY3RvcigKICAgIHJlbGlnaW9uLAogICAgImxvY2FsIiA9ICJGYWl0aCBvZiBsb2NhbCBzYWxpZW5jZSIsCiAgICAiY2hhcmlzbWF0aWMiID0gIkNoYXJpc21hdGljIGV2YW5nZWxpY2FsIENocmlzdGlhbml0eSIpKSAlPiUKICBncm91cF9ieShjb3VudHJ5LCByZWxpZ2lvbiwgc2l0ZSkgJT4lCiAgc3VtbWFyaXNlX2F0KHZhcnMoc3Bldl9zY29yZSwgcHZfc2NvcmUsIGFic19zY29yZSksCiAgICAgICAgICAgICAgIGZ1bnMobWVhbiA9IG1lYW4oLiwgbmEucm0gPSBUKSwgc2QgPSBzZCguLCBuYS5ybSA9IFQpKSkgJT4lCiAgdW5ncm91cCgpCmBgYAoKYGBge3J9CmRfd2lkdGggPC0gMC44CmZpZzFfcm93MSA8LSBkMV9maWcgJT4lIAogIG11dGF0ZShyZWxpZ2lvbiA9IHJlY29kZV9mYWN0b3IoCiAgICByZWxpZ2lvbiwKICAgICJsb2NhbCIgPSAiRmFpdGggb2YgbG9jYWwgc2FsaWVuY2UiLAogICAgImNoYXJpc21hdGljIiA9ICJDaGFyaXNtYXRpYyBldmFuZ2VsaWNhbCBDaHJpc3RpYW5pdHkiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHNwZXZfc2NvcmUsIAogICAgICAgICAgICAgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSwgCiAgICAgICAgICAgICBzaGFwZSA9IHNpdGUpKSArCiAgZmFjZXRfZ3JpZCh+IHJlbGlnaW9uKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci53aWR0aCA9IGRfd2lkdGgvMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIuaGVpZ2h0ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9kZ2Uud2lkdGggPSBkX3dpZHRoKSwgCiAgICAgICAgICAgICBhbHBoYSA9IDAuMjUsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5LCByZWxpZ2lvbiwgc2l0ZSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNwZXZfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2Qoc3Bldl9zY29yZSwgbmEucm0gPSBUKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gZF93aWR0aCksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChkYXRhID0gZF9zdW1fczEgJT4lCiAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoLWNvdW50cnksIC1yZWxpZ2lvbiwgLXNpdGUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSksCiAgICAgICAgICAgIGFlcyh5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoc3Bldl9zY29yZV9tZWFuLCAiXG4oIiwgc3Bldl9zY29yZV9zZCwgIikiKSksCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSBkX3dpZHRoKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41LCB2anVzdCA9IDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSAyMToyNCkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKE5BLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3IgPSBGLCBmaWxsID0gRiwgCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoZmlsbCA9ICJibGFjayIpKSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIiwgc2hhcGUgPSAiU2l0ZSIpCmBgYAoKYGBge3J9CmZpZzFfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSAxIiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDAuNSkgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDM1KSkKCmZpZzEgPC0gcGxvdF9ncmlkKAogIGZpZzFfdGl0bGUsCiAgcGxvdF9ncmlkKGZpZzFfcm93MSwgCiAgICAgICAgICAgIG5jb2wgPSAxKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDIwKSkKCmdnc2F2ZSgiLi9wbmdfZmlsZXMvZmlnMS5wbmciLCBwbG90ID0gZmlnMSwgZGV2aWNlID0gInBuZyIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSAqIDAuNSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNC41LCBmaWcuYXNwID0gMC41fQpmaWcxCmBgYAoKU3Bpcml0dWFsIEV2ZW50cyBzY29yZXMsIGJ5IHJlbGlnaW9uLCBjb3VudHJ5LCBhbmQgc2l0ZSBpbiBTdHVkeSAxLCByZXNjYWxlZCB0byByYW5nZSBmcm9tIDAtMS4gU21hbGwgcG9pbnRzIGNvcnJlc3BvbmQgdG8gaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMsIGxhcmdlciBwb2ludHMgYXJlIG1lYW5zLCBhbmQgZXJyb3IgYmFycyBhcmUgwrExIHN0YW5kYXJkIGRldmlhdGlvbjsgbWVhbnMgKGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zKSBhcmUgYWxzbyBwcm92aWRlZC4gTG9jYWwgcmVsaWdpb25zIHdlcmUgYXMgZm9sbG93c+KAlFVTOiBNZXRob2Rpc207IEdoYW5hOiBBZnJpY2FuIHRyYWRpdGlvbmFsIHJlbGlnaW9uOyBUaGFpbGFuZDogQnVkZGhpc207IHVyYmFuIENoaW5hOiBCdWRkaGlzbTsgcnVyYWwgQ2hpbmE6IHNwaXJpdCBtZWRpdW1zaGlwOyB1cmJhbiBWYW51YXR1OiBQcmVzYnl0ZXJpYW5pc207IHJ1cmFsIFZhbnVhdHU6IGFuY2VzdHJhbCBrYXN0b20gcHJhY3RpY2VzLgoKCiMgRmlndXJlIDIKCmBgYHtyfQpmaWcyX2Z1biA8LSBmdW5jdGlvbihnKXsKICBuZXdfcGxvdCA8LSBnICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSksIGFscGhhID0gMC4xKSArCiAgICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxtIiwgCiAgICAgICAgICAgICAgICBsdHkgPSAyLCBzaXplID0gMC43LCBhbHBoYSA9IDAsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKwogICAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgICB4bGltKDAsIDEpICsKICAgIHlsaW0oMCwgMSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkKICAKICByZXR1cm4obmV3X3Bsb3QpCn0KYGBgCgpgYGB7cn0KZmlnMl9zdHVkeTFfcHYgPC0gZDFfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwdl9zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiUG9yb3NpdHkgVmlnbmV0dGVzIiwKICAgICAgIHkgPSAiU3Bpcml0dWFsIEV2ZW50cyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKCmZpZzJfc3R1ZHkxX2FicyA8LSBkMV9maWcgJT4lCiAgIyBtdXRhdGVfYXQodmFycyhlbmRzX3dpdGgoIl9zY29yZSIpKSwgc2NhbGUpICU+JQogIGdncGxvdChhZXMoeCA9IGFic19zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiQWJzb3JwdGlvbiIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWcyX3N0dWR5Ml9wb3IgPC0gZDJfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwb3Jfc2NvcmUsIHkgPSBzcGV2X3Njb3JlKSkgJT4lCiAgZmlnMl9mdW4oKSArCiAgbGFicyh4ID0gIlBvcm9zaXR5IFNjYWxlIiwKICAgICAgIHkgPSAiU3Bpcml0dWFsIEV2ZW50cyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKCmZpZzJfc3R1ZHkzX2FicyA8LSBkM19maWcgJT4lCiAgIyBtdXRhdGVfYXQodmFycyhlbmRzX3dpdGgoIl9zY29yZSIpKSwgc2NhbGUpICU+JQogIGdncGxvdChhZXMoeCA9IGFic19zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiQWJzb3JwdGlvbiIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWcyX3N0dWR5NF9wdiA8LSBkNF9maWcgJT4lCiAgIyBtdXRhdGVfYXQodmFycyhlbmRzX3dpdGgoIl9zY29yZSIpKSwgc2NhbGUpICU+JQogIGdncGxvdChhZXMoeCA9IHB2X3Njb3JlLCB5ID0gc3Bldl9zY29yZSkpICU+JQogIGZpZzJfZnVuKCkgKwogIGxhYnMoeCA9ICJQb3Jvc2l0eSBWaWduZXR0ZXMiLAogICAgICAgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQoKZmlnMl9zdHVkeTRfcG9yIDwtIGQ0X2ZpZyAlPiUKICAjIG11dGF0ZV9hdCh2YXJzKGVuZHNfd2l0aCgiX3Njb3JlIikpLCBzY2FsZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcG9yX3Njb3JlLCB5ID0gc3Bldl9zY29yZSkpICU+JQogIGZpZzJfZnVuKCkgKwogIGxhYnMoeCA9ICJQb3Jvc2l0eSBTY2FsZSIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWcyX3N0dWR5NF9hYnMgPC0gZDRfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhYnNfc2NvcmUsIHkgPSBzcGV2X3Njb3JlKSkgJT4lCiAgZmlnMl9mdW4oKSArCiAgbGFicyh4ID0gIkFic29ycHRpb24iLAogICAgICAgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQpgYGAKCmBgYHtyfQpmaWcyX3N0dWR5MV90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlNUVURZIDEiLCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDcpKQoKZmlnMl9yb3cxIDwtIHBsb3RfZ3JpZCgKICBmaWcyX3N0dWR5MV90aXRsZSwKICBwbG90X2dyaWQoZmlnMl9zdHVkeTFfcHYsIGZpZzJfc3R1ZHkxX2FicywgbmNvbCA9IDIsIGxhYmVscyA9IGMoIkEiLCAiQiIpKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEwKSkKYGBgCgpgYGB7cn0KZmlnMl9zdHVkeTJfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSAyIiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCA3KSkKCmZpZzJfc3R1ZHkzX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgMyIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKSArCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgNykpCgpmaWcyX3JvdzIgPC0gcGxvdF9ncmlkKAogIHBsb3RfZ3JpZChmaWcyX3N0dWR5Ml90aXRsZSwgZmlnMl9zdHVkeTNfdGl0bGUpLAogIHBsb3RfZ3JpZChmaWcyX3N0dWR5Ml9wb3IsIGZpZzJfc3R1ZHkzX2FicywgCiAgICAgICAgICAgIG5jb2wgPSAyLCBsYWJlbHMgPSBjKCJDIiwgIkQiKSksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxMCkpCmBgYAoKYGBge3J9CmZpZzJfc3R1ZHk0X3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgNCIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKSArCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgNykpCgpmaWcyX3JvdzMgPC0gcGxvdF9ncmlkKAogIGZpZzJfc3R1ZHk0X3RpdGxlLAogIHBsb3RfZ3JpZChwbG90X2dyaWQoZmlnMl9zdHVkeTRfcHYsIGZpZzJfc3R1ZHk0X3BvciwgCiAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgbGFiZWxzID0gYygiRSIsICJGIikpLCAKICAgICAgICAgICAgcGxvdF9ncmlkKE5VTEwsIGZpZzJfc3R1ZHk0X2FicywgTlVMTCwgCiAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDIsIDEpLCBsYWJlbHMgPSBjKCIiLCAiRyIsICIiKSksIAogICAgICAgICAgICBuY29sID0gMiksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAyMCkpCmBgYAoKYGBge3J9CmZpZ19sZWdlbmQgPC0gZ2V0X2xlZ2VuZChmaWcyX3N0dWR5MV9wdiArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSkKYGBgCgpgYGB7cn0KZmlnMiA8LSBwbG90X2dyaWQoZmlnMl9yb3cxLCBmaWcyX3JvdzIsIGZpZzJfcm93MywgZmlnX2xlZ2VuZCwKICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxLCAyLCAwLjIpKQoKZ2dzYXZlKCIuL3BuZ19maWxlcy9maWcyLnBuZyIsIHBsb3QgPSBmaWcyLCBkZXZpY2UgPSAicG5nIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA2ICogMi4xKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMi4xfQpmaWcyCmBgYAoKUmVsYXRpb25zaGlwcyBiZXR3ZWVuIFNwaXJpdHVhbCBFdmVudHMgc2NvcmVzIGFuZCBzY29yZXMgb24gbWVhc3VyZXMgb2YgcG9yb3NpdHkgKGxlZnQpIGFuZCBhYnNvcnB0aW9uIChyaWdodCksIGJ5IHN0dWR5IGFuZCBjb3VudHJ5LCByZXNjYWxlZCB0byByYW5nZSBmcm9tIDAtMS4gU21hbGwgY29sb3JlZCBwb2ludHMgY29ycmVzcG9uZCB0byBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cywgZG90dGVkIGNvbG9yZWQgbGluZXMgY29ycmVzcG9uZCB0byB0aGUgdHJlbmQgd2l0aGluIGVhY2ggY291bnRyeSwgYW5kIHNvbGlkIGJsYWNrIGxpbmVzIGNvcnJlc3BvbmQgdG8gdGhlIG92ZXJhbGwgdHJlbmQgY29sbGFwc2luZyBhY3Jvc3MgY291bnRyaWVzLiBTZWUgRmlnLiBTMSBmb3IgYSBwYXJhbGxlbCB2aXN1YWxpemF0aW9uIG9mIERhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyBzY29yZXMgaW4gU3R1ZGllcyAzLTQuCgoKIyBGaWd1cmUgMwoKYGBge3J9CmZpZzNfZnVuIDwtIGZ1bmN0aW9uKGcpewogIG5ld19wbG90IDwtIGcgKwogICAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAwLjI1LCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGICkgKwogICAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoTkEsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC4yNSkpCiAgCiAgcmV0dXJuKG5ld19wbG90KQp9CmBgYAoKYGBge3J9CmRfc3VtX3M0IDwtIGQ0X2ZpZyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2VfYXQodmFycyhzcGV2X3Njb3JlLCBkc2Vfc2NvcmUsIHB2X3Njb3JlLCBwb3Jfc2NvcmUsIGFic19zY29yZSksCiAgICAgICAgICAgICAgIGZ1bnMobWVhbiA9IG1lYW4oLiwgbmEucm0gPSBUKSwgc2QgPSBzZCguLCBuYS5ybSA9IFQpKSkgJT4lCiAgdW5ncm91cCgpCmBgYAoKYGBge3J9CmZpZzNfc3BldiA8LSBkNF9maWcgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHNwZXZfc2NvcmUsIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnkpKSAlPiUKICBmaWczX2Z1bigpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNwZXZfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2Qoc3Bldl9zY29yZSwgbmEucm0gPSBUKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIzLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fdGV4dChkYXRhID0gZF9zdW1fczQgJT4lCiAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoLWNvdW50cnkpLCBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSwKICAgICAgICAgICAgYWVzKHkgPSAxLCBsYWJlbCA9IHBhc3RlMChzcGV2X3Njb3JlX21lYW4sICJcbigiLCBzcGV2X3Njb3JlX3NkLCAiKSIpKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41LCB2anVzdCA9IDEpICsKICBsYWJzKHggPSAiQ291bnRyeSIsIHkgPSAiU3Bpcml0dWFsIEV2ZW50cyIpCmBgYAoKYGBge3J9CmZpZzNfZHNlIDwtIGQ0X2ZpZyAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCB5ID0gZHNlX3Njb3JlLCBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5KSkgJT4lCiAgZmlnM19mdW4oKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvdW50cnkpICU+JQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihkc2Vfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2QoZHNlX3Njb3JlLCBuYS5ybSA9IFQpKSAlPiUKICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4gLSBzZCwgeW1heCA9IG1lYW4gKyBzZCksCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkX3N1bV9zNCAlPiUKICAgICAgICAgICAgICBtdXRhdGVfYXQodmFycygtY291bnRyeSksIGZ1bnMoZm9ybWF0KHJvdW5kKC4sIDIpLCBuc21hbGwgPSAyKSkpLAogICAgICAgICAgICBhZXMoeSA9IDEsIGxhYmVsID0gcGFzdGUwKGRzZV9zY29yZV9tZWFuLCAiXG4oIiwgZHNlX3Njb3JlX3NkLCAiKSIpKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41LCB2anVzdCA9IDEpICsKICBsYWJzKHggPSAiQ291bnRyeSIsIHkgPSAiRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2VzIikKYGBgCgpgYGB7cn0KZmlnM19wdiA8LSBkNF9maWcgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHB2X3Njb3JlLCBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5KSkgJT4lCiAgZmlnM19mdW4oKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvdW50cnkpICU+JQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihwdl9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChwdl9zY29yZSwgbmEucm0gPSBUKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIzLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fdGV4dChkYXRhID0gZF9zdW1fczQgJT4lCiAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoLWNvdW50cnkpLCBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSwKICAgICAgICAgICAgYWVzKHkgPSAxLCBsYWJlbCA9IHBhc3RlMChwdl9zY29yZV9tZWFuLCAiXG4oIiwgcHZfc2NvcmVfc2QsICIpIikpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUsIHZqdXN0ID0gMSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJQb3Jvc2l0eSBWaWduZXR0ZXMiKQpgYGAKCmBgYHtyfQpmaWczX3BvciA8LSBkNF9maWcgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHBvcl9zY29yZSwgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSkpICU+JQogIGZpZzNfZnVuKCkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5KSAlPiUKICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4ocG9yX3Njb3JlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNkKHBvcl9zY29yZSwgbmEucm0gPSBUKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIzLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fdGV4dChkYXRhID0gZF9zdW1fczQgJT4lCiAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoLWNvdW50cnkpLCBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSwKICAgICAgICAgICAgYWVzKHkgPSAxLCBsYWJlbCA9IHBhc3RlMChwb3Jfc2NvcmVfbWVhbiwgIlxuKCIsIHBvcl9zY29yZV9zZCwgIikiKSksCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIuNSwgdmp1c3QgPSAxKSArCiAgbGFicyh4ID0gIkNvdW50cnkiLCB5ID0gIlBvcm9zaXR5IFNjYWxlIikKYGBgCgpgYGB7cn0KZmlnM19hYnMgPC0gZDRfZmlnICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIHkgPSBhYnNfc2NvcmUsIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnkpKSAlPiUKICBmaWczX2Z1bigpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGFic19zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChhYnNfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoZGF0YSA9IGRfc3VtX3M0ICU+JQogICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKC1jb3VudHJ5KSwgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSksCiAgICAgICAgICAgIGFlcyh5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoYWJzX3Njb3JlX21lYW4sICJcbigiLCBhYnNfc2NvcmVfc2QsICIpIikpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUsIHZqdXN0ID0gMSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJBYnNvcnB0aW9uIikKYGBgCgpgYGB7cn0KZmlnM19zdHVkeTRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSA0IiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDAuNSkgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDM1KSkKCmZpZzMgPC0gcGxvdF9ncmlkKAogIGZpZzNfc3R1ZHk0X3RpdGxlLAogIHBsb3RfZ3JpZChmaWczX3NwZXYsIGZpZzNfZHNlLCAKICAgICAgICAgICAgZmlnM19wdiwgZmlnM19wb3IsIAogICAgICAgICAgICBmaWczX2FicywgTlVMTCwgCiAgICAgICAgICAgIG5jb2wgPSAyLCBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiKSksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAyMCkpCgpnZ3NhdmUoIi4vcG5nX2ZpbGVzL2ZpZzMucG5nIiwgcGxvdCA9IGZpZzMsIGRldmljZSA9ICJwbmciLCB3aWR0aCA9IDcsIGhlaWdodCA9IDcgKiAxLjUpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDEuNX0KZmlnMwpgYGAKClNjb3JlcyBvbiBtZWFzdXJlcyBvZiBzcGlyaXR1YWwgZXhwZXJpZW5jZSAoQS1CKSwgcG9yb3NpdHkgKEMtRCkgYW5kIGFic29ycHRpb24gKEUpIGluIFN0dWR5IDQsIHJlc2NhbGVkIHRvIHJhbmdlIGZyb20gMC0xLiBTbWFsbCBwb2ludHMgY29ycmVzcG9uZCB0byBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cywgbGFyZ2VyIHBvaW50cyBhcmUgbWVhbnMsIGFuZCBlcnJvciBiYXJzIGFyZSDCsTEgc3RhbmRhcmQgZGV2aWF0aW9uOyBtZWFucyAoYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMpIGFyZSBhbHNvIHByb3ZpZGVkLgoKCiMgRmlndXJlIFMxCgpgYGB7cn0KZmlnczFfc3R1ZHkzX2FicyA8LSBkM19maWcgJT4lCiAgIyBtdXRhdGVfYXQodmFycyhlbmRzX3dpdGgoIl9zY29yZSIpKSwgc2NhbGUpICU+JQogIGdncGxvdChhZXMoeCA9IGFic19zY29yZSwgeSA9IGRzZV9zY29yZSkpICU+JQogIGZpZzJfZnVuKCkgKwogIGxhYnMoeCA9ICJBYnNvcnB0aW9uIiwKICAgICAgIHkgPSAiRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2VzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQoKZmlnczFfc3R1ZHk0X3B2IDwtIGQ0X2ZpZyAlPiUKICAjIG11dGF0ZV9hdCh2YXJzKGVuZHNfd2l0aCgiX3Njb3JlIikpLCBzY2FsZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHZfc2NvcmUsIHkgPSBkc2Vfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiUG9yb3NpdHkgVmlnbmV0dGVzIiwKICAgICAgIHkgPSAiRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2VzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQoKZmlnczFfc3R1ZHk0X3BvciA8LSBkNF9maWcgJT4lCiAgIyBtdXRhdGVfYXQodmFycyhlbmRzX3dpdGgoIl9zY29yZSIpKSwgc2NhbGUpICU+JQogIGdncGxvdChhZXMoeCA9IHBvcl9zY29yZSwgeSA9IGRzZV9zY29yZSkpICU+JQogIGZpZzJfZnVuKCkgKwogIGxhYnMoeCA9ICJQb3Jvc2l0eSBTY2FsZSIsCiAgICAgICB5ID0gIkRhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKCmZpZ3MxX3N0dWR5NF9hYnMgPC0gZDRfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhYnNfc2NvcmUsIHkgPSBkc2Vfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiQWJzb3JwdGlvbiIsCiAgICAgICB5ID0gIkRhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKYGBgCgpgYGB7cn0KZmlnczFfc3R1ZHkzX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgMyIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKSArCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgNykpCgpmaWdzMV9zdHVkeTRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSA0IiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCA3KSkKCmZpZ3MxX3JvdzEgPC0gcGxvdF9ncmlkKAogIHBsb3RfZ3JpZChmaWdzMV9zdHVkeTRfdGl0bGUsIGZpZ3MxX3N0dWR5M190aXRsZSksCiAgcGxvdF9ncmlkKGZpZ3MxX3N0dWR5NF9wdiwgZmlnczFfc3R1ZHkzX2FicywgbmNvbCA9IDIsIGxhYmVscyA9IGMoIkEiLCAiQiIpKSwKICBwbG90X2dyaWQoZmlnczFfc3R1ZHk0X3RpdGxlLCBmaWdzMV9zdHVkeTRfdGl0bGUpLAogIHBsb3RfZ3JpZChmaWdzMV9zdHVkeTRfcG9yLCBmaWdzMV9zdHVkeTRfYWJzLCBuY29sID0gMiwgbGFiZWxzID0gYygiQyIsICJEIikpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMTAsIDEsIDEwKSkKYGBgCgpgYGB7cn0KZmlnX2xlZ2VuZCA8LSBnZXRfbGVnZW5kKGZpZ3MxX3N0dWR5NF9wdiArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSkKYGBgCgpgYGB7cn0KZmlnczEgPC0gcGxvdF9ncmlkKGZpZ3MxX3JvdzEsIGZpZ19sZWdlbmQsCiAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDAuMikpCgpnZ3NhdmUoIi4vcG5nX2ZpbGVzL2ZpZ3MxLnBuZyIsIHBsb3QgPSBmaWdzMSwgZGV2aWNlID0gInBuZyIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNiAqIDEuMikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDEuMn0KZmlnczEKYGBgCgpSZWxhdGlvbnNoaXBzIGJldHdlZW4gRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2VzIHNjb3JlcyBhbmQgc2NvcmVzIG9uIG91ciBtZWFzdXJlcyBvZiBwb3Jvc2l0eSAobGVmdCBzaWRlKSBhbmQgYWJzb3JwdGlvbiAocmlnaHQgc2lkZSksIGJ5IHN0dWR5IGFuZCBjb3VudHJ5LCByZXNjYWxlZCB0byByYW5nZSBmcm9tIDAtMS4gU21hbGwgY29sb3JlZCBwb2ludHMgY29ycmVzcG9uZCB0byBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cywgZG90dGVkIGNvbG9yZWQgbGluZXMgY29ycmVzcG9uZCB0byB0aGUgdHJlbmQgd2l0aGluIGVhY2ggY291bnRyeSwgYW5kIHNvbGlkIGJsYWNrIGxpbmVzIGNvcnJlc3BvbmQgdG8gdGhlIG92ZXJhbGwgdHJlbmQsIGNvbGxhcHNpbmcgYWNyb3NzIGNvdW50cmllcy4KCgoK